package com.zwh.se.constant_variable_operator;

/**
 * 算术运算符： +，-，*，/，%，++，--
 *
 * @author yexi
 */
public class ArithmeticOperators {
    public static void main(String[] args) {

        System.out.println("---------- +:用作加法,也可以用作字符串连接符 ----------");
        int count = 5 + 5;
        System.out.println("count的值:" + count);
        System.out.println("count的值:" + 5 + 5);//作为字符串连接符时，即便写了数字也会被当做字符处理
        System.out.println("count的值:" + (5 + 5));//如果还是打算计算，那就可以用()括起来

        System.out.println("---------- -:用作减法 ----------");
        count = 10 - 5;
        System.out.println("count的值:" + count);

        System.out.println("---------- *:用作乘法 ----------");
        count = 5 * 5;
        System.out.println("count的值:" + count);

        System.out.println("---------- /:除法运算符。用作除法,但注意是取整除,或者称之为取商 ----------");
        int num = 10;
        System.out.println(num / 3);//输出的是3,这就是整除
        float r = num * 1.0f / 3;//如果想要除出小数的效果,则使用浮点数类型才可以
        System.out.println(r);

        System.out.println("---------- %:取余运算符。用作取余数,或者称之为取模 ----------");
        System.out.println(10 % 3);//总结:模谁就不会超过谁
        //比如目前有这么一个需求:问47天有几周几天
        int days = 47;
        int week = days / 7;
        int day = days - week * 7;//这么写也可以,就是写起来麻烦,这时就可以用到 % 了
        System.out.println("47天有" + week + "周" + day + "天");
        day = days % 7;
        System.out.println("47天有" + week + "周" + day + "天");

        System.out.println("---------- ++:递增运算符(写在变量前称为前置运算,写在变量后称为后置运算) ----------");
        int i = 10;
        int j = 0;
        //情况1(++在变量后面,做后置运算):
        i++;//意味着:i先参与运算,然后自增1
        System.out.println(i);
        //那什么叫先参与运算呢
        j = i++ + 10;//比如这个运算:i++,所以是先参与运算,也就是目前i是11,然后+10,因此j算出来就是21,算完后i自增,变成12了
        System.out.println(j);//输出21
        System.out.println(i);//输出12

        //情况2(++在变量前面,做前置运算):
        ++i;//意味着:i自增1,然后再参与运算
        j = ++i + 10;//比如这个运算:++i,表示先自增,所以现在i是14,然后+10,因此j算出来是24
        System.out.println(j);//输出24
        System.out.println(i);//输出14
        // TIPS:无论这个变量是否参与到运算中去，只要用了++运算符，这个变量本身就加1操作。
        //      所谓的不同概念只是指如果变量参与到运算中去的话，会在运算时产生的影响。
        // TIPS:底层本质：使用++i会先执行iinc再执行iload，而使用i++会先执行iload再执行iinc
        //      iinc作用是自增局部变量表中的值，iload作用是取出该变量值并压入操作数栈
        //增强理解的变种(开发不会用的,但笔试多见):
        j = ++i + i++;//目前i是14,由于++i在前面先被解析到,因此先执行iinc自增成15,随后iload取走15压入操作数栈,后面i++,先执行iload取走15通过iadd算出30,最后i再执行iinc自增成16
        System.out.println(i);//输出16
        System.out.println(j);//输出30
        j = i++ + ++i;//目前i是16,由于i++在前面先被解析到,先执行iload取走16,iinc自增成17,然后++i通过iinc自增成18,iadd算出j是34
        System.out.println(i);//输出18
        System.out.println(j);//输出34
        j = i++ + i++;//目前i是18,由于i++在前面先被解析到,先执行iload取走18,iinc自增成19,然后i++再iload取走19,iadd算出j是37,最后iinc自增成20
        System.out.println(i);//输出20
        System.out.println(j);//输出37
        j = ++i + ++i;//目前i是20,由于++i在前面先被解析到,iinc自增成21,iload取走21,然后++i再iinc自增成22,iload取走22,iadd算出j是43
        System.out.println(i);//输出22
        System.out.println(j);//输出43

        // TIPS:这个取值中间还有着运算符优先级的影响(++优先级>+)，这点会另外开个类来讲解

        System.out.println("---------- --:递减运算符,跟递增运算符一样,只是用作减法 ----------");
        //这种在运算中只需要一个操作数的运算符，被称之为"单目运算符"，又叫"一元运算符"。
        // 包括有逻辑非运算符!、按位取反运算符~、自增自减运算符++，--等。
    }
}

